package lvm.struct;

import lvm.Contexte;
import lvm.LvmException;

public class Symbole extends Atome {
	protected String val;

	public Symbole(String val) {
		this.val = val;
	}

	/**
	 * @return une erreur (pas de car pour un Symbole)
	 * @throws LvmException
	 */
	public Sexpr getCar() throws LvmException {
		throw new LvmException("Appel de CAR sur un symbole: " + this.val);
	}

	/**
	 * @return une erreur (pas de cdr pour Nil)
	 * @throws LvmException
	 */
	public Sexpr getCdr() throws LvmException {
		throw new LvmException("Appel de CDR sur un symbole: " + this.val);
	}

	/**
	 * @return une erreur
	 * @throws LvmException
	 */
	public Sexpr eval() throws LvmException {
		if(Contexte.getContexteCourant().getVaraibles(this)!=null){
			return Contexte.getContexteCourant().getVaraibles(this);
		}
		throw new LvmException("Variable inconnue: "+toString());
	}

	/**
	 * @return la valeur du symbole
	 */
	public String toString() {
		return this.val;
	}

	public boolean equals(Sexpr arg) throws LvmException {
		return (arg instanceof Symbole && toString().equals(arg.toString()));
	}
}